package org.example.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

/**
 * 自定义的字符串分包解码器的示例程序
 * @author hh
 * @since 2024/11/2
 */
public class StringReplayDecoder extends ReplayingDecoder<StringReplayDecoder.PHASE> {

    enum PHASE {
        PHASE_1, // 第1阶段：解码出字符串的长度
        PHASE_2, // 第2阶段：按照第一个阶段的字符串长度解码出字符串的内容
    }

    private int length;
    private byte[] intBytes;

    public StringReplayDecoder() {
        super(PHASE.PHASE_1);
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> out) throws Exception {
        /*
            每一次字符串解码分为两个步骤：
            第一步，解码出一个字符串的长度。
            第二步，按照第一个阶段的字符串长度解码出字符串的内容。
         */
        switch (state()) {
            case PHASE_1:
                // 第一步，从装饰器ByteBuf中读取字符串的长度
                length = byteBuf.readInt();
                intBytes = new byte[length];
                // 进入第二步，读取内容
                // 并设置“读指针检查点”为当前的readerIndex位置
                checkpoint(PHASE.PHASE_2);
                break;
            case PHASE_2:
                // 第二步，从装饰器ByteBuf中读取字符串的长度
                byteBuf.readBytes(intBytes, 0, length);
                out.add(new String(intBytes, "utf-8"));
                // 第二步解析成功，进入下一个字符串的解析
                // 并设置“读指针检查点”为当前的readerIndex位置
                checkpoint(PHASE.PHASE_1);
                break;
            default:
                break;
        }
    }
}
